from datetime import datetime
from loguru import logger

# 定义默认返回结果
result = {'code':50 , 'message':''}


# 从文件中读取数据 ，返回的是列表
def from_file_get_data(file_name):
    f = None
    try:
        with open(file_name,'r',encoding='utf-8') as f:
            line = f.readline()
            user_data = eval(line)              # 将字符串转化为列表
            logger.info('user_data:{}',user_data)
            return user_data
    except FileNotFoundError as e:
        # print("没有找到文件，请检查文件名是否存在")
        logger.error("没有找到文件，请检查文件名是否存在")
    except Exception as e:
        logger.error("未知异常，错误:{}".format(e))
        # print("未知异常，错误:{}".format(e))
    finally:
        if f:
            f.close()

# 保存列表数据到文件中
def save_data(file_name,file_content):
    f = None
    try:
        with open(file_name,'w',encoding='utf-8') as f:
            logger.info("文件内容:{}".format(str(file_content)))
            f.write(str(file_content))
    except Exception as e:
        print("异常:{}".format(e))
    finally:
        if f:
            f.close()


lst_a = []

user_data = lst_a if lst_a else from_file_get_data('user_data.txt')

# 登录功能
def login(username,password):

    # 如果用户名为空或密码为空 ，给出用户名或密码不能为空的提示
    if username is None or username == '':
        result.update({'code':1,'message':"用户名不能为空!"})
        return result
    if password is None or password == '':
        result.update({'code':2,'message':'密码不能为空!'})
        return result

    # 用户和密码匹配成功，登录成功 ，并且将用户的数据一起返回 。
    for user_info in user_data:
        if username == user_info.get('account') and password == user_info.get('password'):
            result.update({"code":0,"message":"登录成功!",'user_list':user_data})
            return result

    # 如果用户和密码不匹配 ，给出错误提示 。
    result.update({'code':3,"message":"用户名或密码不正确，请重新输入!"})
    return result


# 判断是否登录
def is_login():
    if result.get('code'):
        result.update({'code': 11, 'message': '用户未登录，无法查询用户数据'})
        return result



class User(object):

    # 添加用户
    def add_user(self,username,password='123456',**kwargs):
        user_dict = {}
        user_dict['account'] = username
        user_dict['password'] = password
        user_dict.update(**kwargs)
        user_data.append(user_dict)
        save_data('user_data.txt',user_data)        # 将列表中的数据写入到文件中
        now = datetime.now()
        time_str = now.strftime('%Y-%m-%d %H:%M:%S')
        logger.debug("time_str:{}".format(time_str))
        # print("time_str:",time_str)
        result.update({"code":20,"message":"添加用户成功!","add_time":time_str})
        return result



    # 用户查询功能
    def get_user(self,username=None):
        # 1.判断用户是否登录 ，若没有登录 ，给出错误提示
        is_login()

        # 2. 是否输入用户名
        if username is None or username == '':
            result.update({'code':12,'message':'请输入查询的用户名!'})
            return result

        result.update({'user_list':[]})
        # 拿着用户传入的用户到列表中进行查询，若查询到则返回数据，若没有查询到给出提示 。
        lst = []        # 存放的是查询后的用户数据。
        for x in user_data:
            account = x.get('account')
            if username in account:     # 支持模糊查询
                x.pop('password')       # 将此键值对从字典中删除。
                lst.append(x)

        # 若查询到了数据
        logger.info("查询到的数据列表:{}".format(lst))
        if lst:
            result.update({'code':10,"message":"用户查询成功!","user_list":lst})
            return result

        # 未查询到用户数据
        result.update({"code":13,"message":"未查询到用户数据"})
        return result

    # 删除用户
    def delete_user(self,username):
        # 判断是否进行登录
        is_login()

        # 判断用户名是否为空
        if username is None or username == '':
            result.update({'code':31,"message":"用户名不能为空"})
            return result

        # 判断输入的账号是否在当前数据中
        for x in user_data:
            account = x.get('account')
            if username == account:
                user_data.remove(x)
                save_data('user_data.txt', user_data)
                result.update({"code":30,"message":"删除成功!"})
                return result

        return {"code":32,"message":"未找到用户"}

    # 修改用户
    def update_user(self,username,**kwargs):

        # 判断是否登录
        is_login()

        # 判断用户名是否为空
        if username is None or username == '':
            result.update({"code":41,"message":"用户名不能为空！"})
            return result

        # 判断用户名是否存在
        for x in user_data:
            account = x.get('account')
            if username == account:
                # 进行更新
                dct = {}
                if kwargs:
                    for key,vls in kwargs.items():
                        if key == 'role':
                            dct['role'] = vls
                            continue
                        if key == 'dept':
                            dct['dept'] = vls
                            continue
                        if key == 'password':
                            dct['password'] = vls
                            continue
                    if dct:
                        x.update(dct)
                        save_data('user_data.txt',user_data)
                        return {"code":50,"message":"更新成功!"}

        return {"code":51,"message":"未更新任何数据"}


if __name__ == '__main__':


    logger.add('iter.log',level='DEBUG',rotation='1MB',compression='zip')
    user = User()
    flag = True
    while flag:
        vls = input("请用户输入对应编号进行操作:"
                    "\n 1:) 进行登录:"
                    "\n 2:) 进行用户查询，请输入用户名:"
                    "\n 3:) 进行添加用户，请输入用户信息:"
                    "\n 4:) 进行用户删除，请输入删除的用户名:"
                    "\n 5:) 进行用户修改，请输入修改的用户名"
                    "\n q:) 退出操作"
                    "\n 其它字符:) 未知操作，请重新输入:")
        if vls not in ('1','2','3','4','5','q','quit'):
            print("="*30)
            continue

        # 登录操作
        if vls == '1':
            username = input("请输入用户名:")
            password = input("请输入密码:")

            login_result = login(username, password)
            print(login_result)
            print("="*30)

        # 用户查询
        if vls == '2':
            name = input("请输入查询的用户名:")
            get_result = user.get_user(name)
            print(get_result)
            print("=" * 30)

        # 用户添加
        if vls == '3':
            name = input("请输入添加的用户名:")
            get_result = user.get_user(name)
            if 10 == get_result.get('code'):
                result.update({"code":21,"message":"用户已存在，无法添加"})
                print(result)
                continue
            password = input("请输入用户密码:")
            role = input("请输入角色名称:")
            dept = input("请输入部门名称:")
            add_result = user.add_user(name,password,role=role,dept=dept)
            print(add_result)
            print("="*30)

        # 用户删除
        if vls == '4':
            name = input("请输入删除的用户:")
            delete_result = user.delete_user(name)
            print(delete_result)
            print("="*30)

        # 用户更新
        if vls == '5':
            user_dict = {}
            name = input("请输入修改的用户名:")
            password = input("请修改密码:")
            role = input("请输入修改后的角色:")
            dept = input("请输入修改后的部门:")
            if password != '':
                user_dict['password'] = password
            if role != '':
                user_dict['role'] = role
            if dept != '':
                user_dict['dept'] = dept
            update_result = user.update_user(name,**user_dict)
            print(update_result)
            print("=" * 30)


        # 用户退出
        if vls in ('q','quit'):
            flag = False
            print("退出成功!")